Fix treesit-parser-create behavior regarding indirect buffers
authorYuan Fu <casouri@gmail.com>
Thu, 13 Mar 2025 07:33:47 +0000 (00:33 -0700)
committerYuan Fu <casouri@gmail.com>
Fri, 14 Mar 2025 03:09:03 +0000 (20:09 -0700)
The previous fix fixed the problem that treesit-parser-create
always use the current buffer, but that introduce another subtle
problem: if an indirect buffer creates a parser, the parser
saves the base buffer rather than the indirect buffer.  In Emacs
29, if you create a parser in an indirect buffer, the parser
saves the indirect buffer.  This change of behavior breaks some
existing use-cases for people using indirect buffer with
tree-sitter.

In Emacs 31, indirect buffers and base buffer get their own
parser list, so this problem doesn't exist anymore.  The fix is
only for Emacs 30.

* src/treesit.c (Ftreesit_parser_create): Use the buffer that's
given to treesit-parser-create, even if it's an indirect buffer.

src/treesit.c

index f234698defd4762817edbf77ea19b8d4ec61f1d5..3a0e9674f6597f8be8f02b3053d28dcaaf767683 100644 (file)
@@ -1560,6 +1560,9 @@ an indirect buffer.  */)
       CHECK_BUFFER (buffer);
       buf = XBUFFER (buffer);
     }
+
+  struct buffer *buffer_given = buf;
+
   if (buf->base_buffer)
     buf = buf->base_buffer;
 
@@ -1595,7 +1598,7 @@ an indirect buffer.  */)
 
   /* Create parser.  */
   Lisp_Object lisp_buf;
-  XSETBUFFER (lisp_buf, buf);
+  XSETBUFFER (lisp_buf, buffer_given);
   Lisp_Object lisp_parser = make_treesit_parser (lisp_buf,
                                                 parser, NULL,
                                                 language, tag);